<?php

namespace App\Controllers;

use Framework\Database;
use Framework\Validation;
use Framework\Session;
use Framework\Authorisation;
use Framework\Middleware\Authorise;

class ListingController{
    protected $db;

    public function __construct() {
        $config = require basePath('config/db.php');
        $this->db = new Database($config);
    }

    /**
    *展示所有岗位
    *
    *@return void
    */
    public function index() {
        $listings = $this->db->query('SELECT * FROM listing ORDER BY created_at DESC')->fetchAll();

        loadView('listings/index',[
            'listings' => $listings
        ]);
    }
    /**
    *展示创建职位表单
    *
    *@return void
    */
    public function create(){
        loadView('listings/create');
    }
    /**
    *展示单一岗位页面
    *
    *@return void
    */
    public function show($params){
        $id = $params['id'] ?? '';

        $params = [
            'id' => $id
        ];

        $listing = $this->db->query('SELECT * FROM listing WHERE id = :id', $params)->fetch();

        if(!$listing) {
            ErrorController::notFound('该岗位不存在');
            return;
        }

        loadView('listings/show',[
            'listing' => $listing
        ]);
    }


    public function store() {
    $allowedFields = ['title','description','salary','tags','company','address','city','province','phone',
    'email','requirements','benefits'];

    $newListingData = array_intersect_key($_POST, array_flip($allowedFields));

    $newListingData['user_id'] = Session::get('user')['id'];

    $newListingData = array_map('sanitize', $newListingData);

    $requiredFields = ['title','description','email','city','province'];

    $errors = [];
    foreach ($requiredFields as $field) {
        if (empty($newListingData[$field]) || !Validation::string($newListingData[$field])){
            $errors[$field] = ucfirst($field) . '为必需项';
        }
    }

    if (!empty($errors)) {
        loadView('listings/create',[
            'errors' => $errors,
            'listing' => $newListingData
        ]);
    } else {
        $fields = [];

        foreach ($newListingData as $field => $value) {
            $fields[] = $field;
        }

        $fields = implode(', ',$fields);

        $values =[];

        foreach ($newListingData as $field => $value) {
            if ($value === '') {
                $newListingData[$field] = null;
            }
            $values[] = ':' . $field;
        }

        $values = implode(', ',$values);

        $query = "INSERT INTO listing ({$fields}) VALUES ({$values})";

        $this->db->query($query, $newListingData);

        Session::setFlashMessage('success_message', '已成功创建职位！');

        redirect('/listings');
    }
  }

  public function destroy($params) {

    $id = $params['id'];

    $params = [ 'id' => $id];

    $listing = $this->db->query('SELECT * FROM listing WHERE id = :id', $params)->fetch();

    if (!$listing) {
        ErrorController::notFound('职位不存在！ ');
        return;
    }
    if (!Authorisation::isOwner($listing->user_id)) {
        inspect($_SESSION);
        Session::setFlashMessage('error_message', '你没有权限删除此职位！');
        return redirect('/listings/' . $listing->id);
    }
    //执行删除操作
    $this->db->query('DELETE FROM listing WHERE id = :id', $params);

    Session::setFlashMessage('error_message', '删除职位成功！');

    redirect('/listings');
  }
  /**
      *展示创建职位表单
      *@param array
      *@return void
      */
  public function edit($params){

    $id = $params['id'] ?? '';

    $params = [
        'id' => $id
    ];

    $listing = $this->db->query('SELECT * FROM listing WHERE id = :id', $params)->fetch();

    if (!$listing) {
        ErrorController::notFound('职位不存在！');
        return;
    }

    //授权
    if (!Authorisation::isOwner($listing->user_id)) {
        Session::setFlashMessage('error_message','你没有权限删除此职位！');
        return redirect('/listings/' . $listing->id);
    }

    loadView('listings/edit', [
        'listing' => $listing
    ]);
  }
  /**
      *展示创建职位表单
      *@param array
      *@return void
      */
  public function update($params){
    $id = $params['id'] ?? '';

    $params = [
        'id' => $id
    ];

    $listing = $this->db->query('SELECT * FROM listing WHERE id = :id', $params)->fetch();

    if (!$listing) {
        ErrorController::notFound('职位不存在！');
        return;
    }

    //授权
    if (!Authorisation::isOwner($listing->user_id)) {
        Session::setFlashMessage('error_message','你没有权限删除此职位！');
        return redirect('/listings/' . $listing->id);
    }

    $allowedFields = ['title','description','salary','tags','company','address','city','province','phone',
    'email','requirements','benefits'];

    $updateValues = array_intersect_key($_POST, array_flip($allowedFields));

    $updateValues = array_map('sanitize', $updateValues);

    $requiredFields = ['title', 'description', 'salary', 'email', 'city', 'province'];

    $errors = [];

    foreach ($requiredFields as $field) {
        if (empty($updateValues[$field]) || !Validation::string($updateValues[$field])) {
            $errors[$field] = ucfirst($field) . '为必需项！';
        }
    }
        if (!empty($errors)) {
            loadView('listings/edit',[
                'listing' => $listing,
                'errors' => $errors
            ]);
            exit;
        } else {
            $updateFields = [];
            foreach (array_keys($updateValues) as $field) {
                $updateFields[] = "{$field} = :{$field}";
            }
            $updateFields = implode(', ',$updateFields);

            $updateQuery = "UPDATE listing SET $updateFields WHERE id = :id";

            $updateValues['id'] = $id;

            $this->db->query($updateQuery, $updateValues);

            $_SESSION['success_message'] = '职位信息已更新！';

            redirect('/listings/' . $id);
        }
    }
     /**
      *根据关键词和地点搜索列表
      *
      *@return void
      */
      public function search() {
        $keywords = isset($_GET['keywords']) ? trim($_GET['keywords']) : '';
        $location = isset($_GET['location']) ? trim($_GET['location']) : '';

        $query = "SELECT * FROM listing WHERE
        (title LIKE :keywords OR description LIKE :keywords OR
        tags LIKE :keywords OR company LIKE :keywords) AND
        (city LIKE :location OR province LIKE :location)";

        $param = [
            'keywords' => "%{$keywords}%",
            'location' => "%{$location}%"
        ];

        $listings = $this->db->query($query, $params)->fetchAll();

        loadView('/listings/index', [
        'listings' => $listings,
        'keywords' => $keywords,
        'location' => $location
        ]);
      }


}